package com.demo.thread.threadpool;

import java.io.IOException;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;

public class ThreadPoolTest {
private  static ThreadPoolExecutor thread ;
private static AtomicInteger count;
//不能使用这个，有可能线程池使用丢弃策略；，不会走任务,不会走run 的逻辑、
private static AtomicInteger pageCount = new AtomicInteger();
//导致await哪里一直不能走完。

private static CountDownLatch latch = new CountDownLatch(100);
private static AtomicInteger errorCount;
    public static void fun1(){
        thread = new ThreadPoolExecutor(10,20,10, TimeUnit.DAYS,
                new ArrayBlockingQueue<>(10));
         count = new AtomicInteger();
         errorCount = new AtomicInteger();
        testPageError();
    }


    private static void testPage0(){
        for(int i =0;i<100;i++){
            try{
                //有可能这里执行任务的时候会抛错了，默认是哪个Abort 策略，如果不捕获异常下面fun1（）函数的后面代码不走了
                //这里是异步还是同步
                thread.execute(new Runnable() {
                    @Override
                    public void run() {
                        latch.countDown();
                        int taskFinishCount =  count.incrementAndGet();
                        System.out.println("结果："+Thread.currentThread().getName()+",taskFinishCount:"+taskFinishCount);
                    }
                });
            }catch (Exception e){
                errorCount.incrementAndGet();
                e.printStackTrace();
            }
        }
    }

    //ces shu >100 26299 ge task
    //count.get() 会导致死循环
    private static void testPageError(){
        while(count.get() < 100){
            pageCount.getAndIncrement();
           // System.out.println("repeatCout:"+pageCount.get());
            try{
                //有可能这里执行任务的时候会抛错了，默认是哪个Abort 策略，如果不捕获异常下面fun1（）函数的后面代码不走了
                //这里是异步还是同步
                thread.execute(new Runnable() {
                    public void run() {
                        //offset ye hui >100
                        latch.countDown();
                        int offSet =  count.incrementAndGet();
                        System.out.println("结果111："+Thread.currentThread().getName()+",offSet:"+offSet);
                    }
                });
            }catch (Exception e){
                errorCount.incrementAndGet();
                //e.printStackTrace();
            }
        }
    }


    /**
     * 1 不能使用countdonw来监测是否做完了，因为execute默认里面是拒绝策略。直接抛出异常的；
     * 2
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        //默认是无法处理新任务时候，程序抛出异常了 吗
        fun1();
        while(thread.getActiveCount() >=1){
            //System.out.println("000000");
        }
//        try {
//            latch.await(); //不能通过这种方式判断，因为execute 会报错 完成数：99个任务
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
        System.out.println("******************子线程执行完毕******************************");
        System.out.println("完成数："+count.get()+"个任务");
        System.out.println("错误执行数："+errorCount.get()+"个任务");
        System.out.println("page Total count:"+pageCount.get());
        //thread.shutdown(); 不加这个行代码程序不会停止，因为还有线程在运行。
        thread.shutdown();
    }
}
